﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using App_Code.Clases;
using SubSonic.Repository;

public partial class Productos_VerProductos : Page
{
    static readonly SimpleRepository repository=new SimpleRepository("Electro",SimpleRepositoryOptions.None);
    protected void Page_Load(object sender, EventArgs e)
    {
        Session["EsConsultaNueva"] = Session["EsConsultaNueva"]??true;
        if (!Page.IsPostBack)
        {
            if (bool.Parse(Session["EsConsultaNueva"].ToString()))
            {
                var cantidadProductos = repository.All<Producto>().Count();
                Session["CantidadProductos"] = cantidadProductos;
                var razon = (new decimal(cantidadProductos)/12);
                Session["NumeroPaginas"] = decimal.Ceiling(razon);
                var paginaEnCurso = (Session["Pagina"] == null ? 0 : int.Parse(Session["Pagina"].ToString()));
                Session["Pagina"] = paginaEnCurso;
                var productosVarios = from p in repository.GetPaged<Producto>(paginaEnCurso, 12)
                                      select p;
                Session["ProductosParaGrid"] = productosVarios.ToList();
            }
        }
    }

    [WebMethod]
    public static object ObtenerInformacionProducto(int idProducto)
    {
        try
        {
            var producto = repository.Single<Producto>(idProducto);
            var modelo = repository.Single<Modelo>(producto.IdModelo);
            var marca = repository.Single<Marca>(modelo.IdMarca);
            return new
                       {
                           producto.Nombre,
                           producto.Descripcion,
                           NombreModelo=modelo.Nombre,
                           producto.Codigo,
                           modelo.Garantia,
                           producto.Id,
                           NombreMarca=marca.Nombre,
                           modelo.Origen,
                           producto.Precio
                       };
        }
        catch(Exception ex)
        {
            return ex.Message;
        }
    }

    [WebMethod]
    public static string BuscarProductosCategoria(int idCategoria)
    {
        try
        {
            var ctx = HttpContext.Current;
            var productosVarios = new List<Producto>();
            var modelos = repository.All<Modelo>().Where(m => m.IdCategoria == idCategoria);
            foreach (var mod in modelos)
            {
                if (mod != null)
                {
                    var prods = repository.All<Producto>().Where(p => p.IdModelo == mod.Id);
                    productosVarios.AddRange(prods);
                }
            }
            var cantidadProductos = productosVarios.Count();
            var razon = (new decimal(cantidadProductos)/12);
            if (cantidadProductos > 0)
            {
                var cantidadMostrar = (cantidadProductos < 12) ? cantidadProductos : 12;
                var productos = from p in productosVarios.GetRange(0, cantidadMostrar)
                                select p;
                productosVarios = productos.ToList();
            }
            ctx.Session["txtoBusqueda"] = null;

            ctx.Session["CantidadProductos"] = cantidadProductos;
            ctx.Session["NumeroPaginas"] = decimal.Ceiling(razon);
            var paginaEnCurso = 0;
            ctx.Session["Pagina"] = paginaEnCurso;
            ctx.Session["ProductosParaGrid"] = productosVarios;
            ctx.Session["EsConsultaNueva"] = false;
            ctx.Session["IdCategoria"] = idCategoria;
            return "Ok";
        }
        catch(Exception ex)
        {
            return ex.Message;
        }
    }

    [WebMethod]
    public static string PaginadoGridProductos(int pagina)
    {
        try
        {
            var ctx = HttpContext.Current;
            var idCategoria = (ctx.Session["IdCategoria"] != null)
                                  ? int.Parse(ctx.Session["IdCategoria"].ToString())
                                  : 0;
            ctx.Session["txtoBusqueda"] = ctx.Session["txtoBusqueda"] != null
                                              ? ctx.Session["txtoBusqueda"].ToString()
                                              : null;
            var esPorCategoria = ctx.Session["IdCategoria"] != null;
            var esBusquedaPersonal = ctx.Session["txtoBusqueda"] != null;
            var cantidadProductos = 0;
            var razon = 0m;
            var paginaEnCurso = 0;
            var productosVarios = new List<Producto>();
            if (esPorCategoria)
            {
                var modelos = repository.All<Modelo>().Where(m => m.IdCategoria == idCategoria);
                foreach (var mod in modelos)
                {
                    if (mod != null)
                    {
                        var prods = repository.All<Producto>().Where(p => p.IdModelo == mod.Id);
                        productosVarios.AddRange(prods);
                    }
                }
                cantidadProductos = productosVarios.Count();
                razon = (new decimal(cantidadProductos)/12);
                var cantidadMostrar = (cantidadProductos < ((pagina+1)*12)) ? (cantidadProductos - (pagina*12)) : 12;
                var nuevaPagina = pagina == 0 ? 0 : ((pagina*12) - 1);
                var productos = from p in productosVarios.GetRange(nuevaPagina, cantidadMostrar)
                                select p;
                productosVarios = productos.ToList();
                ctx.Session["txtoBusqueda"] = null;
            }
            else if (esBusquedaPersonal)
            {
                ctx.Session["IdCategoria"] = null;
                cantidadProductos = repository.All<Producto>().Count();
                razon = (new decimal(cantidadProductos)/12);
                var productos = from p in repository.GetPaged<Producto>(pagina, 12)
                                select p;
                productosVarios = productos.ToList();
            }
            else
            {
                cantidadProductos = repository.All<Producto>().Count();
                razon = (new decimal(cantidadProductos)/12);
                var productos = from p in repository.GetPaged<Producto>(pagina, 12)
                                select p;
                productosVarios = productos.ToList();
            }

            ctx.Session["CantidadProductos"] = cantidadProductos;
            ctx.Session["NumeroPaginas"] = decimal.Ceiling(razon);
            paginaEnCurso = pagina;
            ctx.Session["Pagina"] = paginaEnCurso;
            ctx.Session["ProductosParaGrid"] = productosVarios;
            ctx.Session["EsConsultaNueva"] = false;
            return "Ok";
        }
        catch(Exception ex)
        {
            return ex.Message;
        }
    }

    [WebMethod]
    public static bool InicioGrid()
    {
        var ctx = HttpContext.Current;
        ctx.Session["EsConsultaNueva"] = true;
        ctx.Session["IdCategoria"] = null;
        ctx.Session["txtoBusqueda"] = null;
        return true;
    }

    [WebMethod]
    public static object BuscarPorTexto(string textoBusqueda)
    {
        try
        {
            var ctx = HttpContext.Current;
            ctx.Session["txtoBusqueda"] = textoBusqueda;
            var productos = from p in repository.Find<Producto>(x => x.Codigo.Contains(textoBusqueda))
                            select p;
            return new {Correcto=true};
        }
        catch(Exception ex)
        {
            return new {Correcto = false, Mensaje = "Ha ocurrido un error:\n" + ex.Message};
        }

    }
}
